var LevelDB = require("levelup");
import * as LevelDown from 'leveldown';
import { LevelUp } from 'levelup';
import { LogMgr } from './LogMgr';

// 谷歌的 leveldb  kv类型的数据库

// LevelDB 只是一个 C/C++ 编程语言的库, 不包含网络服务封装, 所以无法像一般意义的存储服务器(如 MySQL)那样, 用客户端来连接它. LevelDB 自己也声明, 使用者应该封装自己的网络服务器.

var error = LogMgr.error('TeLeveldb');

class TeLeveldb {
    db: LevelUp;
    constructor() {

    }

    init(dbpath: string, cb: (succ: boolean) => void) {
        this.db = LevelDB(LevelDown(dbpath));
        this.db.open(this._on_ready.bind(this, cb));
    }

    put(key: string, value: string, cb: () => void) {
        if (typeof value != 'string') {
            value = JSON.parse(value);
        }

        this.db.put(key, value, (function (_cb, err) {
            _cb && _cb()
        }).bind(this, cb));
    }

    get(key: string, cb: (value: string) => void) {
        this.db.get(key, (function (_cb, err, val) {
            let r_val = '';
            if (err) {
                if (err.type == "NotFoundError") {
                    r_val = '';
                }
                else {
                    error(err);
                    return;
                }
            }
            else {
                r_val = val;
            }

            _cb && _cb(r_val);
        }).bind(this, cb))
    }

    private _on_ready(cb, error) {
        error && console.log(error);
        cb && cb(true);
        this.test();
    }

    private _index_ = 0;
    test() {

        this.db.get('mxindex', (err: { type: string }, value) => {
            if (err) {
                if (err.type == "NotFoundError") {
                    this._index_ = 0;
                }
                else {
                    console.log(err);
                    return;
                }
            }
            else {
                this._index_ = parseInt((value).toString()) || 0;
            }

            console.log(this._index_);
        })
    }
}

export var levelDBInst = new TeLeveldb();